/**
 * Pick 类型的使用场景示例
 * 展示在实际开发中什么时候会用到 Pick
 */

import type { Equal, Expect } from '@type-challenges/utils'

// 导入 MyPick 类型（假设在 practice.ts 中定义）
// 如果还没有实现，可以先注释掉测试用例
type MyPick<T, K extends keyof T> = {
  [P in K]: T[P]
}

// ========== 场景1：表单验证 - 只验证部分字段 ==========

interface UserForm {
  username: string;
  email: string;
  password: string;
  confirmPassword: string;
  age: number;
  bio: string;
}

// 只验证必填字段
type RequiredFields = MyPick<UserForm, 'username' | 'email' | 'password'>;
// 结果：{ username: string; email: string; password: string }

// 只验证可选字段
type OptionalFields = MyPick<UserForm, 'age' | 'bio'>;
// 结果：{ age: number; bio: string }

// ========== 场景2：API 响应处理 - 提取核心数据 ==========

interface ApiResponse {
  data: any;
  status: number;
  message: string;
  timestamp: string;
  requestId: string;
  version: string;
}

// 只关心核心数据
type CoreData = MyPick<ApiResponse, 'data' | 'status'>;
// 结果：{ data: any; status: number }

// 只关心元数据
type Metadata = MyPick<ApiResponse, 'timestamp' | 'requestId' | 'version'>;
// 结果：{ timestamp: string; requestId: string; version: string }

// ========== 场景3：权限控制 - 根据用户角色显示字段 ==========

interface UserProfile {
  id: number;
  username: string;
  email: string;
  phone: string;
  address: string;
  salary: number;
  department: string;
  manager: string;
}

// 普通用户只能看到基本信息
type PublicProfile = MyPick<UserProfile, 'id' | 'username' | 'email'>;

// 同事可以看到更多信息
type ColleagueProfile = MyPick<UserProfile, 'id' | 'username' | 'email' | 'department'>;

// 管理员可以看到所有信息
type AdminProfile = UserProfile; // 不需要 Pick，直接使用完整类型

// ========== 场景4：数据库查询 - 选择需要的字段 ==========

interface DatabaseRecord {
  id: number;
  createdAt: Date;
  updatedAt: Date;
  deletedAt: Date | null;
  version: number;
  data: any;
}

// 创建新记录时不需要这些字段
type CreateRecord = MyPick<DatabaseRecord, 'data'>;
// 结果：{ data: any }

// 更新记录时需要这些字段
type UpdateRecord = MyPick<DatabaseRecord, 'data' | 'version'>;
// 结果：{ data: any; version: number }

// ========== 场景5：组件 Props - 传递部分属性 ==========

// 简化 React 类型，避免依赖问题
interface ButtonProps {
  type: 'primary' | 'secondary' | 'danger';
  size: 'small' | 'medium' | 'large';
  disabled: boolean;
  loading: boolean;
  icon: string;
  children: any; // 简化类型
  onClick: () => void;
  className: string;
  style: any; // 简化类型
}

// 基础按钮只需要核心属性
type BasicButtonProps = MyPick<ButtonProps, 'type' | 'size' | 'children' | 'onClick'>;

// 图标按钮需要额外属性
type IconButtonProps = MyPick<ButtonProps, 'type' | 'size' | 'icon' | 'onClick'>;

// ========== 测试用例 ==========

type cases = [
  // 表单验证测试
  Expect<Equal<RequiredFields, { username: string; email: string; password: string }>>,
  Expect<Equal<OptionalFields, { age: number; bio: string }>>,
  
  // API 响应测试
  Expect<Equal<CoreData, { data: any; status: number }>>,
  Expect<Equal<Metadata, { timestamp: string; requestId: string; version: string }>>,
  
  // 权限控制测试
  Expect<Equal<PublicProfile, { id: number; username: string; email: string }>>,
  Expect<Equal<ColleagueProfile, { id: number; username: string; email: string; department: string }>>,
  
  // 数据库查询测试
  Expect<Equal<CreateRecord, { data: any }>>,
  Expect<Equal<UpdateRecord, { data: any; version: number }>>,
  
  // 组件 Props 测试
  Expect<Equal<BasicButtonProps, { type: 'primary' | 'secondary' | 'danger'; size: 'small' | 'medium' | 'large'; children: any; onClick: () => void }>>,
  Expect<Equal<IconButtonProps, { type: 'primary' | 'secondary' | 'danger'; size: 'small' | 'medium' | 'large'; icon: string; onClick: () => void }>>,
]

/**
 * 总结 Pick 的使用场景：
 * 
 * 1. **数据筛选** - 从大对象中提取需要的属性
 * 2. **权限控制** - 根据用户角色显示不同字段
 * 3. **API 设计** - 返回不同粒度的数据
 * 4. **表单处理** - 验证部分字段
 * 5. **组件设计** - 传递部分属性
 * 6. **数据库操作** - 选择需要的字段
 * 
 * Pick 的核心价值：类型安全地"裁剪"对象类型
 */ 